/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package server.entidades;

import comum.IMsgSource;
import comum.Message;
import server.Server;
import server.colecoes.ColecaoUsuario;

/**
 *
 * @author root
 */
public class Channel implements IMsgSource {

    private ColecaoUsuario usuarios = new ColecaoUsuario();
    private String nome;
    private Server parent;

    public Channel(Server parent, String nome) {
        this.parent = parent;
        this.nome = nome;
    }

    public void addUser(User u) {
        usuarios.adicionarUsuario(u);
        u.transmitirMensagem(new Message(":" + u.getNickname() + "!" + u.getUsername() + "@" + u.getHost() + " JOIN :" + nome));
        transmitirListaTodosUsuarios();
    }

    public void partUser(User u) {
        usuarios.removerUsuario(u);
        if (u.isConectado()) {
            u.transmitirMensagem(new Message(":" + u.getNickname() + "!" + u.getUsername() + "@" + u.getHost() + " PART :" + nome));
        }
        transmitirListaTodosUsuarios();
    }

    public void rmUser(User u) {
        usuarios.removerUsuario(u);
        transmitirListaTodosUsuarios();
    }

    public void transmitirMsgTodos(User sender, Message m) {
        for (User u : usuarios.getUsuarios()) {
            if (u != sender) {
                u.transmitirMensagem(m);
            }
        }
    }

    public void transmitirListaTodosUsuarios() {
        for (User u : usuarios.getUsuarios()) {
            Message m = new Message(":" + parent.getServerHost() + " 353 " + u.getNickname() + " = " + nome + " :" + u.getNickname() + " " + getUserNicks(u));
            u.transmitirMensagem(m);
            u.transmitirMensagem(new Message(":" + parent.getServerHost() + " 366 " + u.getNickname() + " " + nome + " :End of /NAMES list."));
        }
    }

    public String getUserNicks(User dest) {
        String ret = "";
        for (User u : usuarios.getUsuarios()) {
            if (u != dest) {
                ret += u.getNickname() + " ";
            }
        }
        return ret.trim();
    }

    public String getNome() {
        return nome;
    }

    public String getStringName() {
        return this.nome;
    }

    public boolean isChannel() {
        return true;
    }

    public boolean isUser() {
        return false;
    }
}
